import type { App } from 'vue'

import router from '@/router'
import { useMessage } from '@fl/hooks/web/use-message'
// import { credentialsFetch } from '@fl/micro/credentials-fetch'
import { hostMap } from '@fl/micro/host-map'
import lifecycle from '@fl/micro/lifecycle'
import { useUserStoreWithOut } from '@fl/store/modules/user'
import WujieVue from 'wujie-vue3'

const { bus, preloadApp, setupApp } = WujieVue

const subAppDict = {
    goodHouse: hostMap('goodHouse'),
    lease: hostMap('lease'),
}

const { createMessage } = useMessage()

export function setupWujie(app: App<Element>) {
    bus.$on('parentLogout', () => {
        const userStore = useUserStoreWithOut()

        createMessage.error('登录已过期, 请重新登录')

        // 其中一个子应用通知父应用登出, 首先要求所有子应用都登出, 自己再登出
        bus.$emit('logout')
        userStore.logout()
    })

    // 降级
    const degrade = window.localStorage.getItem('degrade') === 'true' || !window.Proxy || !window.CustomElementRegistry
    const props = {
        jump: (name: string) => {
            router.push({ name })
        },
    }

    /**
     * 大部分业务无需设置 attrs
     * 此处修正 iframe 的 src，是防止github pages csp报错
     * 因为默认是只有 host+port，没有携带路径
     */
    // const attrs = import.meta.env.PROD ? { src: hostMap('//localhost:8000/') } : {}

    /**
     * 配置应用，主要是设置默认配置
     * preloadApp、startApp的配置会基于这个配置做覆盖
     */
    setupApp({
        alive: true, // true 为保活模式, 类似 keep-alive
        // attrs,
        degrade,
        exec: false, // 预执行, 提高子应用打开速度
        // fetch: credentialsFetch,
        name: 'lease', // 子应用唯一
        props,
        sync: true,
        url: subAppDict.lease,
        ...lifecycle,
    })

    setupApp({
        alive: true, // true 为保活模式, 类似 keep-alive
        // attrs,
        degrade,
        exec: false, // 预执行, 提高子应用打开速度
        // fetch: credentialsFetch,
        name: 'goodHouse', // 子应用唯一
        props,
        sync: true,
        url: subAppDict.goodHouse,
        ...lifecycle,
    })

    if (import.meta.env.VITE_WUJIE_NO_PRELOAD !== 'false') {
        if (window.localStorage.getItem('preload') !== 'false') {
            preloadApp({
                name: 'lease',
                url: subAppDict.lease,
            })

            if (window.Proxy) {
            // vue3 和 vite 的子应用挂载到这里
                preloadApp({
                    name: 'goodHouse',
                    url: subAppDict.goodHouse,
                })
            }
        }
    }

    app.use(WujieVue)
}
